package com.etc.demoarray.sort;

import java.util.Arrays;
import java.util.Random;

/**
 * @author: knowno
 * @create: 2024-09-04 10:29
 * @Version 1.0
 **/
public class SelecionSort {

    public static void main(String[] args) {

        int[] rand = new int[10];

        //1 给数组元素随机值
        Random random = new Random();
        for (int i = 0; i < rand.length; i++) {
            rand[i] = random.nextInt(100);
        }
        System.out.println("数组元素: " + Arrays.toString(rand));

        //排序
        selectionSorting(rand);
        System.out.println("数组元素: " + Arrays.toString(rand));

    }

    /**
     * 选择排序的主要思想是寻找未排序中最小的元素加入到已有序列,直到未排序序列为空。
     * 选择排序的特点是查询次数较多,元素位置变换较少,比较适合易于查询而移动较复杂的数据.
     * 需要两层循环，一层循环表示的轮数(比较)
     *
     * @param arr
     */

    public static void selectionSorting(int[] arr) {

        //可以定义一个变量来保存元素最小的那个对象的索引值
        int smallIndex;

        //外循环，轮数
        for (int i = 0; i < arr.length - 1; i++) {
            //给我smallIndex赋值,每次循环进来的时候，i的值就本次循环的smallindex
            smallIndex = i;
            //内循环，比较的次数 .从i+1开始,到数组的最后一个元素结束
            for (int j = i + 1; j < arr.length; j++) {
                //依次比较，找最小值，保留其索引位置
                //如果我们认为 smallIndex所在索引的这个元素比 后续某个元素还大，那么最小值就是j所在的位置的元素
                if (arr[j] < arr[smallIndex]) {
                    //我们将j保留起来，j所在的元素才是最小值
                    smallIndex = j;
                }
            }

            //找到了新的元素比我们i所在的位置的值要小
            if (smallIndex != i) {
                //交换
                int t = arr[smallIndex];
                arr[smallIndex] = arr[i];
                arr[i] = t;
            }

        }

    }
}
